home *** CD-ROM | disk | FTP | other *** search
/ GFX Sensations 1 / Graphic Sensations - Volume 1.iso / tools / amiga / 3d_tools / irit40s.lha / Irit / irit / bezier.irt < prev    next >
Encoding:
Text File  |  1993-12-30  |  6.3 KB  |  286 lines

  1. #
  2. # Some routines to test bezier curves/surfaces.
  3. #
  4.  
  5. #
  6. # Set display to on to view some results, off to view nothing.
  7. #
  8. display = on;
  9.  
  10. if ( machine == msdos, resolution = 5, resolution = 10 );
  11.  
  12. s45 = sin( pi / 4 );
  13. cbzr = list( ctlpt( P2, 1.0, 1.0, 0.0 ),
  14.          ctlpt( P2, s45, s45, s45 ),
  15.          ctlpt( P2, 1.0, 0.0, 1.0 ) );
  16. sbzr = list ( list( ctlpt( E3, 0.1, 0.0, 1.0 ),
  17.                 ctlpt( E3, 0.3, 1.0, 0.0 ),
  18.                 ctlpt( E3, 0.0, 2.0, 1.0 ) ),
  19.               list( ctlpt( E3, 1.1, 0.0, 0.0 ),
  20.                 ctlpt( E3, 1.3, 1.5, 2.0 ),
  21.                 ctlpt( E3, 1.0, 2.1, 0.0 ) ),
  22.               list( ctlpt( E3, 2.1, 0.0, 2.0 ),
  23.                 ctlpt( E3, 2.3, 1.0, 0.0 ),
  24.                 ctlpt( E3, 2.0, 2.0, 2.0 ) ),
  25.               list( ctlpt( E3, 3.1, 0.0, 0.0 ),
  26.                 ctlpt( E3, 3.3, 1.5, 2.0 ),
  27.                 ctlpt( E3, 3.0, 2.1, 0.0 ) ),
  28.               list( ctlpt( E3, 4.1, 0.0, 1.0 ),
  29.                 ctlpt( E3, 4.3, 1.0, 0.0 ),
  30.                 ctlpt( E3, 4.0, 2.0, 1.0 ) ) );
  31.  
  32. cb = cbezier( cbzr );
  33. color( cb, red );
  34. sb = sbezier( sbzr );
  35. color( sb, red );
  36.  
  37. drawctlpt = 0;
  38. if ( display == on, interact( list( axes, cb, sb ) ) );
  39. drawctlpt = blue;
  40. if ( display == on, interact( list( axes, cb, sb ) ) );
  41. drawctlpt = 0;
  42.  
  43. #
  44. # Curve refinement (note the returned curve is a bspline curve).
  45. #
  46. cb_ref = crefine( cb, false, list( 0.25, 0.5, 0.75 ) );
  47. color( cb_ref, yellow );
  48. if ( display == on, interact( list( axes, cb, cb_ref ) ) );
  49. free( cb_ref );
  50.  
  51. #
  52. # Curve subdivision.
  53. #
  54. cb_lst = cdivide( cb, 0.5 );
  55. cb1 = nth( cb_lst, 1 );
  56. color( cb1, green );
  57. cb2 = nth( cb_lst, 2 );
  58. color( cb2, yellow );
  59. free( cb_lst );
  60. if ( display == on, interact( list( axes, cb, cb1, cb2 ) ) );
  61. free( cb1 ); free( cb2 );
  62.  
  63. #
  64. # Region from curve.
  65. #
  66. cbr1 = cregion( cb, 0.3, 0.6 );
  67. color( cbr1, yellow );
  68. cbr2 = cregion( cb, 0.5, 1.0 );
  69. color( cbr2, green );
  70. cbr3 = cregion( cb, 0.3, 0.0 );
  71. color( cbr3, blue );
  72. if ( display == on, interact( list( cb, cbr1, cbr2, cbr3 ) ) );
  73. free( cbr1 ); free( cbr2 ); free( cbr3 );
  74.  
  75. #
  76. # Surface subdivision and merging.
  77. #
  78. sb_lst = sdivide( sb, COL, 0.4 );
  79. sb1 = nth( sb_lst, 1 );
  80. color( sb1, green );
  81. sb2 = nth( sb_lst, 2 );
  82. color( sb2, yellow );
  83. free( sb_lst );
  84. if ( display == on, interact( list( axes, sb, sb1, sb2 ) ) );
  85. sbm = smerge( sb1, sb2, COL, 1 );
  86. display = on;
  87.  
  88. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  89. sbm = smerge( sb1 * trans( vector( 0.0, -0.5, 0.0 ) ),
  90.           sb2 * trans( vector( 0.0,  0.5, 0.0 ) ), COL, 0 );
  91. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  92. free( sb1 );
  93. free( sb2 );
  94.  
  95. sb_lst = sdivide( sb, ROW, 0.8 );
  96. sb1 = nth( sb_lst, 1 );
  97. color( sb1, green );
  98. sb2 = nth( sb_lst, 2 );
  99. color( sb2, yellow );
  100. free( sb_lst );
  101. if ( display == on, interact( list( axes, sb, sb1, sb2 ) ) );
  102. sbm = smerge( sb1, sb2, ROW, 1 );
  103. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  104. sbm = smerge( sb1 * trans(vector( -0.5, 0.0, 0.0 ) ),
  105.           sb2 * trans(vector(  0.5, 0.0, 0.0 ) ), ROW, 0 );
  106. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  107. free( sb1 );
  108. free( sb2 );
  109.  
  110. #
  111. # Region from surface.
  112. #
  113. sbr1 = sregion( sb, COL, 0.3, 0.6 );
  114. color( sbr1, yellow );
  115. sbr2 = sregion( sb, COL, 0.8, 1.0 );
  116. color( sbr2, green );
  117. sbr3 = sregion( sb, ROW, 0.1, 0.4 );
  118. color( sbr3, blue );
  119. interact( list( sb, sbr1, sbr2, sbr3 ) );
  120. free( sbr1 ); free( sbr2 ); free( sbr3 );
  121.  
  122. #
  123. # Derivative and normal curves/surfaces
  124. #
  125. drawctlpt = green;
  126. dcb = cderive( cb );
  127. if ( display == on, interact( list( axes, dcb, cb ) ) );
  128. dsb1 = sderive( sb, ROW );
  129. color( dsb1, magenta );
  130. dsb2 = sderive( sb, COL );
  131. color( dsb2, yellow );
  132. if ( display == on, interact( list( axes, dsb1, dsb2, sb ) ) );
  133. nsb = snrmlsrf( sb );
  134. color( nsb, yellow );
  135. if ( display == on, interact( list( axes, nsb, sb ) ) );
  136. free( dcb );
  137. free( scb1 );
  138. free( scb2 );
  139. free( ncb );
  140.  
  141. #
  142. # Iso curves extraction from surface.
  143. #
  144. cb_all = list( axes );
  145. snoc( sb, cb_all );
  146. for ( t = 0.1, 0.1, 0.9,
  147.     cb1 = csurface( sb, COL, t ):
  148.     color( cb1, green ):
  149.     snoc( cb1, cb_all )
  150.     );
  151. for ( t = 0.1, 0.1, 0.9,
  152.     cb1 = csurface( sb, ROW, t ):
  153.     color( cb1, green ):
  154.     snoc( cb1, cb_all )
  155.     );
  156. if ( display == on, interact( cb_all ) );
  157. free( cb_all );
  158.  
  159.  
  160. #
  161. # curves extraction from surface mesh. Note curves may be not on the surface.
  162. #
  163. cb_all = list( axes );
  164. snoc( sb, cb_all );
  165. for ( t = 0, 1, 2,
  166.     cb1 = cmesh( sb, COL, t ):
  167.     color( cb1, green ):
  168.     snoc( cb1, cb_all )
  169.     );
  170. for ( t = 0, 1, 4,
  171.     cb1 = cmesh( sb, ROW, t ):
  172.     color( cb1, green ):
  173.     snoc( cb1, cb_all )
  174.     );
  175. drawctlpt = blue;
  176. if ( display == on, interact( cb_all ) );
  177. drawctlpt = 0;
  178. free( cb_all );
  179.  
  180. #
  181. # convert into polygons/polylines (using default resolution).
  182. #
  183. dumplvl = 1;
  184. resolution;
  185.  
  186. p = gpolyline( list( sb, cb ) );
  187. if ( display == on, interact( list( p, axes ) ) );
  188.  
  189. p = gpolygon( sb );
  190. if ( display == on, viewstate("DrawVNrml"):
  191.             interact( list( p, axes ) ):
  192.             viewstate("DrawVNrml") );
  193.  
  194. #
  195. # reverse surface ( flip normals ).
  196. #
  197. q = gpolygon( -sb );
  198. if ( display == on, viewstate("DrawVNrml"):
  199.             interact( list( q, axes ) ):
  200.             viewstate("DrawVNrml") );
  201.  
  202. free(p);
  203. free(q);
  204.  
  205. #
  206. # Offset approximation by translation of srf/crv in normal direction.
  207. #
  208. cbo = offset(cb, 0.1);
  209. if ( display == on, interact( list( axes, cb, cbo ) ) );
  210. free(cbo);
  211.  
  212. sbo = offset(sb, 0.2);
  213. if ( display == on, interact( list( axes, sb, sbo ) ) );
  214. free(sbo);
  215.  
  216. #
  217. # Surface and Curve evaluation.
  218. #
  219. ceval( cb, 0.0 );
  220. ceval( cb, 0.1 );
  221. ceval( cb, 0.3 );
  222. ceval( cb, 0.5 );
  223. ceval( cb, 0.9 );
  224. ceval( cb, 1.0 );
  225. ceval( cb, 1.5 );
  226.  
  227. pause(1);
  228.  
  229. seval( sb, 0.0, 0.0 );
  230. seval( sb, 0.1, 0.0 );
  231. seval( sb, 0.3, 0.0 );
  232. seval( sb, 0.5, 0.5 );
  233. seval( sb, 0.9, 0.1 );
  234. seval( sb, 1.0, 1.0 );
  235. seval( sb, 1.5, 9.0 );
  236.  
  237. pause(1);
  238.  
  239. #
  240. # Surface and Curve tangents.
  241. #
  242. ctangent( cb, 0.0 );
  243. ctangent( cb, 0.1 );
  244. ctangent( cb, 0.3 );
  245. ctangent( cb, 0.5 );
  246. ctangent( cb, 0.9 );
  247. ctangent( cb, 1.0 );
  248. ctangent( cb, 1.5 );
  249.  
  250. pause(1);
  251.  
  252. stangent( sb, ROW, 0.0, 0.0 );
  253. stangent( sb, COL, 0.1, 0.0 );
  254. stangent( sb, ROW, 0.3, 0.0 );
  255. stangent( sb, COL, 0.5, 0.5 );
  256. stangent( sb, ROW, 0.9, 0.1 );
  257. stangent( sb, COL, 1.0, 1.0 );
  258. stangent( sb, COL, 1.5, 9.0 );
  259.  
  260. pause(1);
  261.  
  262. #
  263. # Surface normals.
  264. #
  265. snormal( sb, 0.0, 0.0 );
  266. snormal( sb, 0.1, 0.0 );
  267. snormal( sb, 0.3, 0.0 );
  268. snormal( sb, 0.5, 0.5 );
  269. snormal( sb, 0.9, 0.1 );
  270. snormal( sb, 1.0, 1.0 );
  271. snormal( sb, 1.5, 9.0 );
  272.  
  273. pause(1);
  274.  
  275.  
  276. #
  277. # save("cb", cb);
  278. # save("sb", sb);
  279. #
  280. # cb1 = load("cb.crv");
  281. # sb1 = load("sb.srf");
  282. #
  283. # save("cb1", cb1);
  284. # save("sb1", sb1);
  285. #
  286. #